package com.wangbo.regexp;

import org.junit.jupiter.api.Test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 正则表达式基本语法
 */
public class BasicSyntax {
    /**
     * 元字符-转义符：\\  (在 Java 的正则表达式中，\\ 代表其他语言中的 \)
     * 需要用到转义符的字符：. * + - ( ) $ / \ ? [ ] ^ { }
     */
    @Test
    public void test01() {
        String content = "a.b.c.d";

        String regexp = "\\.";
        Pattern pattern = Pattern.compile(regexp);
        Matcher matcher = pattern.matcher(content);

        int num = 0;
        while (matcher.find()) {
            System.out.printf("第%d次找到：%s%n", ++num, matcher.group(0));
        }
    }

    /**
     * 元字符-字符匹配符：
     *   1. []：可接收的字符列表，例如：[abcd] 表示 a、b、c、d 中的任意1个字符。
     *   2. [^]：不接收的字符列表，例如：[^abc] 表示除 a、b、c 之外的任意1个字符，包括数字和特殊字符。
     *   3. -：连字符，例如：[a-z] 表示从 a 到 z 26个小写字母中的任意1个字符。
     */
    @Test
    public void test02() {
        String content = "1991EDBD259ADBC56abd";

        String regexp = "[A-Z]{4}";
        Pattern pattern = Pattern.compile(regexp);
        Matcher matcher = pattern.matcher(content);

        int num = 0;
        while (matcher.find()) {
            System.out.printf("第%d次找到：%s%n", ++num, matcher.group(0));
        }
    }

    /**
     * 元字符-字符匹配符：
     *   1. .：匹配除 \n 以外的任意字符，例如：a..b 表示以a开头，b结尾，中间包括2个任意字符，长度为4的字符串.
     *   2. \\d：匹配单个数字字符，相当于[0-9]，例如：\\d{3}(\\d)? 表示包含3个或4个数字的字符串。
     *   3. \\D：匹配单个非数字字符，相当于[^0-9]，例如：\\D(\\d)* 表示以单个非数字字符开头，后接任意个数字字符的字符串。
     *   4. \\w：匹配单个数字、大小写字母字符，相当于[0-9a-zA-Z]，例如：\\d{3}\\w{4} 表示以3个数字字符开头，以4个数字字母字符结尾，长度为7的数字字母字符串。
     *   5. \\W：匹配单个非数字、大小写字母字符，相当于[^0-9a-zA-Z]，例如：\\W+\\d{2} 表示以至少1个非数字字母字符开头，2个数字字符结尾的字符串。
     */
    @Test
    public void test03() {
        String content = "";

        String regexp = "";
        Pattern pattern = Pattern.compile(regexp);
        Matcher matcher = pattern.matcher(content);

        int num = 0;
        while (matcher.find()) {
            System.out.printf("第%d次找到：%s%n", ++num, matcher.group(0));
        }
    }

    /**
     * Java 正则表达式默认是区分字母大小写的，如何实现不区分大小写：
     * 1. (?i)abc 表示abc都不区分大小写；
     * 2. a(?i)bc 表示bc不区分大小写；
     * 3. a((?i)b)c 表示只有b不区分大小写；
     * 4. Pattern pattern = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE);
     */
    @Test
    public void test04() {
        String content = "abc121ABC454abC";

        String regexp = "abc";
        Pattern pattern = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(content);

        int num = 0;
        while (matcher.find()) {
            System.out.printf("第%d次找到：%s%n", ++num, matcher.group(0));
        }
    }
}
